﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using I3.AgenteIA.Dominio.Gramatica;
using Moq;

namespace I3.AgenteIA.Dominio.Teste
{
    [TestClass()]
    public class TagInterpreterTest
    {
        [TestMethod]
        [ExpectedException(typeof(ArgumentNullException))]
        public void InterpretarTeste_Caso1()
        {
            TagInterpreter sentenca = new TagInterpreter();
            Tag tagRetornada = sentenca.Interpretar(null);
        }

        [TestMethod]
        [ExpectedException(typeof(ArgumentNullException))]
        public void InterpretarTeste_PrefixoCaso1()
        {
            // Declara as variaveis auxiliares do teste
            string teste = "teste";
            List<string> prefixo = new List<string>(new string[] { "t", "te", "tes", "test" });
            List<string> sufixo = new List<string>(new string[] { "e", "te", "ste", "este" });

            // Declara os objetos mock do teste
            var tagEsperada = new Mock<Tag>();

            // Configura a execução dos métodos mock
            tagEsperada.SetupGet(o => o.Lexico).Returns(teste);

            InterpretarTeste_Executar(teste, tagEsperada.Object);
        }

        private void InterpretarTeste_Executar(string texto, Tag tagEsperada)
        {
            // Declara as variaveis auxiliares do teste
            // N.A.

            // Declara os objetos mock do teste
            var elemento = new Mock<Elemento>();

            // Configura a execução dos métodos mock
            elemento.SetupGet(o => o.Texto).Returns(texto);

            // Realizada a execução do teste
            TagInterpreter sentenca = new TagInterpreter();
            Tag tagRetornada = sentenca.Interpretar(elemento.Object);

            // Realiza os assets dos objetos mocks e variaveis
            Assert.AreEqual(tagEsperada.Lexico, tagRetornada.Lexico);
            Assert.AreEqual(tagEsperada.Prefixos.Count(), tagRetornada.Prefixos.Count());
            Assert.AreEqual(tagEsperada.Sufixos.Count(), tagRetornada.Sufixos.Count());

            // Realiza os asserts nas listas
            for (int i = 0, total = tagEsperada.Prefixos.Count(); i < total; i++) Assert.AreEqual(tagEsperada.Prefixos[i], tagRetornada.Prefixos[i]);
            for (int i = 0, total = tagEsperada.Sufixos.Count(); i < total; i++) Assert.AreEqual(tagEsperada.Sufixos[i], tagRetornada.Sufixos[i]);
        }
    }
}
